package com.zx.sa.controller;

import java.util.List;
import java.util.Map;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.ChatMemoryRepository;
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.ai.converter.ListOutputConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import reactor.core.publisher.Flux;

@Controller
@CrossOrigin(origins = "*")
@RequestMapping("/prompt")
public class ChatPromptController {

    private final ChatClient chatClient;

    private PromptTemplate promptTemplate = new PromptTemplate("""
            帮我写一份关于“{aaa}”的知乎高赞问答，
            要求：
            1.梳理原文结构：
                -通读原文，明确高赞回答的主题和主要观点。
                -将原文分为几大部分，列出每个部分的核心要点。
            2.打乱原有结构：
                -把原文中的大段或大部分打散。比如，原文从三个角度说明问题，你可以细分成五个或更多角度。
                -如果原文有一些连续性的叙述，考虑拆开来放在不同的部分中讨论。
            3.合并与拆分要点：
                -找出现有段落或者论点中可合并的部分。把一些相似的论点或信息合并在一起，简化论述。
                -原本一起叙述的要点尝试拆分出来单独列为新的小节，或加入更多解释进行延伸。
            4.调整顺序与逻辑：原文的顺序进行重排，不要遵循原来的逻辑线，而通过新的角度重新组织内容。例如，原文先讲原理再讲应用，你可以考虑先引入应用场景，再讲解背后的原理。
            5.创造新的层次与递进关系：
                -在文本中运用明显的逻辑递进，可能从简到繁、从具体到抽象等顺序排列内容。为改写后的部分引入新的小标题、重点分层或者子观点，使得阅读更有层次。
            6.综合完善：
                -将各部分内容连接起来，使整个文本虽然结构被打散，但仍有一条明显的主题或故事线，确保文章的逻辑一致性和连贯性。
            """);


    @Autowired
    public ChatPromptController(ChatModel chatModel) {
        this.chatClient= ChatClient.builder(chatModel)
                .defaultSystem("你是张雪的个人生活管家，回答各种问题！")
                .build();
    }

    @RequestMapping("/index")
    public String index() {
        return "prompt";
    }

    @RequestMapping("/index2")
    public String index2() {
        return "prompt2";
    }

    @RequestMapping("/index3")
    public String index3() {
        return "prompt3";
    }


    @GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<String> chat(String aaa) {
        // 使用提示词
        Prompt prompt = promptTemplate.create(Map.of("aaa", aaa));
        return chatClient.prompt(prompt).stream().content();
    }

    @GetMapping(value = "/chat2", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<String> chat2(String idiom) {
        String systemText = "你是{name}的个人生活管家，回答各种问题！";
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);

        String userText = "成语 {idiom} 拼音是什么？".replace("{idiom}", idiom);
        Message userMessage = new UserMessage(userText);

        Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", "张三"));

        // 使用提示词
        Prompt prompt = new Prompt(List.of(userMessage, systemMessage));

        return chatClient.prompt(prompt).stream().content();
    }

    @GetMapping(value = "/chat3", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @ResponseBody
    public Flux<String> chat3(String idiom) {
        // 使用模板定义提示词
        String systemText = "你是{name}的个人生活管家，回答各种问题！";
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);
        Prompt prompt = systemPromptTemplate.create(Map.of("name", "张三"));

        // 用户输入模板
        String userText = "成语 {idiom} 拼音是什么？";

        return chatClient
                .prompt(prompt)
                // 输入模板
                .user(u -> u.text(userText).param("idiom", idiom))
                .stream().content();
    }

} 